//多态：同一件事，发生在不同的事物身上，会有不同的结果
//  子类重写父类的方法
//      重写/继承：
//          1.方法返回值、参数列表、方法名一样
//          2.被重写的方法访问修饰符大于等于父类
//          3.被private、static、final修饰的不能重写
//          4.构造方法不能重写
//          5.返回值构成协变关系的可以重写即构成继承关系
//  发生向上转型
//      向上转型：子类转父类，常见场景：传参、赋值、返回值
//      向下转型：父类转子类
//  通过父类引用对象调用重写方法
//圈复杂度：分支语句的数量

class Animal
{
    public String name;
    public int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat()
    {
        System.out.println(name + "正在吃饭！");
    }
}

class Dog extends Animal
{
    public Dog(String name, int age) {
        super(name, age);
    }

    //注解：表示这个需要重写
    @Override
    public void eat()
    {
        System.out.println(name + "在吃狗粮");
    }
}

class Cat extends Animal
{
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name + "在吃猫粮！");
    }
}
public class polymorphic {
    public static void main(String[] args) {
        Animal animal = new Dog("胜胜",10);
        //判断animal 是不是 Cat 的实例
        if(animal instanceof Cat)
        {
            Cat cat = (Cat)animal;
            cat.eat();
        }
        else
        {
            System.out.println(animal.name+"不是猫");
        }
    }

}
